import axios from 'axios';

// 后端 API 的基础 URL，从环境变量中获取
// 确保你的 frontend/.env 文件中有 REACT_APP_API_URL=http://localhost:5000/api
const API_BASE_URL = process.env.REACT_APP_API_URL || 'http://localhost:5000/api';

// 创建 axios 实例，配置基础 URL 和超时时间
const api = axios.create({
  baseURL: API_BASE_URL,
  timeout: 10000, // 请求超时时间，单位毫秒
  headers: {
    'Content-Type': 'application/json'
  }
});

// 请求拦截器：在每个请求发送前，尝试从 localStorage 中获取 token 并添加到 Authorization 头部
api.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token');
    if (!config.headers) {
      config.headers = {} as any;
    }
    if (token && typeof config.headers === 'object') {
      (config.headers as any).Authorization = `Bearer ${token}`;
    }
    return config; // 返回修改后的 config 对象
  },
  error => {
    // 处理请求错误
    return Promise.reject(error);
  }
);

// 响应拦截器 (可选)：处理通用的响应逻辑，例如 token 过期
api.interceptors.response.use(
    response => {
        // 对响应数据做点什么
        return response;
    },
    error => {
        // 处理响应错误，例如 token 过期（通常后端返回特定状态码或错误信息）
        // if (error.response && error.response.status === 401 && error.response.data?.message === 'Invalid token') {
        //     console.error("Token expired or invalid. Redirecting to login.");
        //     localStorage.removeItem('token'); // 移除旧 token
        //     // 这里可以跳转到登录页，但直接在服务层做路由跳转不好，可以在页面组件中根据API调用的错误来判断跳转
        //     // window.location.href = '/login';
        // }
        return Promise.reject(error); // 返回错误对象
    }
);

// 定义认证相关的 API 调用函数
export const authAPI = {
  /**
   * 用户注册
   * @param userData 包含 username, password, walletAddress
   * @returns Promise 包含后端响应数据
   */
  register: async (userData: { username: string; password: string; walletAddress: string }): Promise<any> => {
    const response = await api.post('/user/register', userData);
    return response.data as any; // 返回后端返回的数据结构 { success: boolean, message: string, data?: ... }
  },

  /**
   * 用户登录
   * @param credentials 包含 username, password
   * @returns Promise 包含后端响应数据 { success: boolean, message: string, data?: { token: string, user: ... } }
   */
  login: async (credentials: { username: string; password: string }): Promise<any> => {
    const response = await api.post('/user/login', credentials);
    const data = response.data as any;
    // 登录成功后，将 token 存储到 localStorage
    if (data?.success && data.data?.token) {
      localStorage.setItem('token', data.data.token);
    }
    return data;
  },

  /**
   * 获取当前登录用户信息
   * @returns Promise 包含后端响应数据 { success: boolean, data?: { userId: string, username: string, walletAddress: string } }
   */
  getCurrentUser: async (): Promise<any> => {
    const response = await api.get('/user/me');
    return response.data as any;
  },

  /**
   * 用户登出 (前端操作，移除 token)
   */
  logout: (): void => {
    localStorage.removeItem('token');
    // 实际应用中，登出可能还需要后端接口来使 token 失效
    // api.post('/auth/logout'); // 如果有登出接口的话
  }
};